package de.fhb.fitmeier.example;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import de.fhb.fitmeier.dbhibernate.persistence.Medikament;
import de.fhb.fitmeier.dbhibernate.persistence.Medikamentartikel;
import de.fhb.fitmeier.dbhibernate.persistence.Warengruppe;
import de.fhb.fitmeier.dbhibernate.util.HibernateUtil;

/**
 * Kleines TestBeispiel zur Benutzung der Fitmeier-Persistenzschicht.
 * Anleitung:
 * - Anlegen der Datenbank
 *   Skripte create.sql und insert.sql in database/ im eigenen 
 *   MySQL-DB-Bereich anlegen.
 * - Konfiguration der Persistenzschicht
 *   Die Konfigurationsdatei muss hibernate.cfg.xml heissen. 
 *   Es sind die ersten drei Properties url, username und password anzupassen.
 * - Ausfuehren der Beispiel-Applikation.
 *   
 * @author Susanne Busse
 */
public class FitmeierExampleApplication {

	
	/**
	 * druckt die Medikamentartikel aus (mit Medikamentname und Packungsgroesse),
	 * die einer bestimmten Warengruppe zugeordnet sind. 
	 * @param wg Warengruppe, dessen Medikamentartikel ausgegeben werden sollen
	 */
	private static void printMedikamentartikel(Warengruppe wg) {

		if (wg == null)
			return;
		
		System.out.println("\n" + wg.getName() + " beinhaltet:");

		Iterator<Medikament> medikamente = wg.getMedikamente().iterator();
		while (medikamente.hasNext()) {
			
			Medikament curMedikament = medikamente.next();
			String curMediname = curMedikament.getName();
			
			Iterator<Medikamentartikel> mediArtikel = curMedikament.getMedikamentartikel().iterator();
			while (mediArtikel.hasNext()) {
				
				Medikamentartikel curMediArtikel = mediArtikel.next();

				System.out.print("  " + curMediname);
				System.out.print(" " + curMediArtikel.getPackungsgroesse());
				
				String normgroesse = curMediArtikel.getNormgroesse();
				if (normgroesse != null)
					System.out.println(", Normgroesse: " + normgroesse);
				else
					System.out.println();
				
			}
			
		}

	}
	
	
	/**
	 * Sucht die Warengruppen Kopfschmerzen und Fieberthermometer heraus und gibt die 
	 * zugeordneten Medikamentartikel aus.
	 */
	public static void main(String[] args) {
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;

		try {

			System.out.println("Herzlich Willkommen!");
			
			tx = session.beginTransaction();

			// liste der Warengruppen Kopfschmerzen und Fieberthermometer ermitteln
			List wgKopfFieber = session.createQuery("from Warengruppe "
					              + "where Name = 'Kopfschmerzen' or Name = 'Fieberthermometer'").list();

			Iterator wgKopfFieberIter = wgKopfFieber.iterator();
			while (wgKopfFieberIter.hasNext()) {

				Warengruppe kopfFieber = (Warengruppe) wgKopfFieberIter.next();			
				printMedikamentartikel(kopfFieber);

			}

			tx.commit();

		} catch (Exception e) {
			
			System.out.println(e.getMessage());
			if (tx != null) 
				tx.rollback();
						
		} finally {
			
			// Shutting down the application
			session.close();
			HibernateUtil.shutdown();
			
		}

	}

}
